package com.yxinsur.imc.business.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yxinsur.imc.business.domain.ImcRecn;
import com.yxinsur.imc.business.vo.ContractExpenseVo;
import com.yxinsur.imc.business.vo.ContractVo;
import com.yxinsur.imc.business.vo.RecnDetailsVo;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 手续费对账单-协议费用科目 Service接口
 *
 * @author imc
 * @date 2021-09-15
 */
public interface IImcRecnExpenseService extends IService<ImcRecn> {
    /**
     * 根据{选择月度}{供应商id}查询协议
     *
     * @param settleMonth 选择月度
     * @param supplierId  供应商id
     * @return 协议
     */
    List<ContractVo> listContractBySettleMonthAndSupplierId(String settleMonth, Long supplierId);

    /**
     * 根据{协议id}查询协议费用科目
     *
     * @param contractIdList 协议id集合
     * @param expenseType    协议费用科目类型
     * @return 协议费用科目
     */
    List<ContractExpenseVo> listImcContractExpenseByContractIds(List<Long> contractIdList, String expenseType);

    /**
     * 根据{主表id}查询协议费用科目
     *
     * @param recnId 主表id
     * @return 协议费用科目
     */
    List<ContractExpenseVo> listImcContractExpenseByRecnId(Long recnId);

    /**
     * 根据{选择月度}{协议费用科目ID}生成查询SQL语句
     *
     * @param settleMonth       选择月度
     * @param contractExpenseId 协议费用科目ID
     * @return 查询SQL语句
     */
    String getCriteriaSQL(String settleMonth, Long contractExpenseId);

    /**
     * 转换：行转列
     * <p>
     * 此处仅根据{orderRiskId}对数据进行分组，不包含动态列
     *
     * @param recnDetailsVoList 初始的手续费核算结果集合
     * @return List<RecnDetailsVo>
     */
    List<RecnDetailsVo> rowTransColumnByOrderRiskId(List<RecnDetailsVo> recnDetailsVoList);

    /**
     * 导出：设置协议费用科目的标题
     *
     * @param contractExpenseIdList 协议费用科目ID集合（标题）
     * @return 动态列
     */
    Map<String, String> setTitle(List<Long> contractExpenseIdList);

    /**
     * 校验：上传文件模板校验是否为正确模板
     *
     * @param file        上传文件
     * @param titleStrArr title数组
     * @param sheetName   sheetName
     * @return boolean 是否为正确模板
     * @throws IOException IOException
     */
    boolean importTemplateVerify(MultipartFile file, String[] titleStrArr, String sheetName) throws IOException;

    /**
     * 设置动态列标题的注解
     *
     * @param titles 动态列的标题
     * @throws NoSuchFieldException   NoSuchFieldException
     * @throws IllegalAccessException IllegalAccessException
     */
    void setCommDetailsAnnotation(Map<String, String> titles) throws NoSuchFieldException, IllegalAccessException;

    /**
     * 转换：运算符
     *
     * @param operator 运算符
     * @param msgType  生成/校验表达式返回前端消息类型
     * @return 转换后的运算符
     */
    String transOperator(String operator, String msgType);

    /**
     * 转换：逻辑运算符
     *
     * @param logicalOperator 逻辑运算符
     * @param msgType         生成/校验表达式返回前端消息类型
     * @return 转换后的逻辑运算符
     */
    String transLogicalOperator(String logicalOperator, String msgType);
}
